package Reflection;

import java.lang.reflect.Method;

/**
 * 通过Class实例获取所有Method信息。
    getMethod(name, Class...) 获取指定名称和参数类型的public方法
    getDeclaredMethod(name, Class...)：获取当前类的某个Method（不包括父类）
    getMethods()：获取所有public方法
    getDeclaredMethods()：获取当前类的所有Method（包括父类）

  一个Method对象包含一个方法的所有信息：
    getName()：方法名
    getParameterTypes()：返回方法的参数类型，是一个Class数组，
    getReturnType()：方法返回类型
    getModifiers()：方法修饰符
 */
public class MethodDemo {
  public static void main(String[] args) {
    Class<Student> cls = Student.class;
    printMethod(cls);
  }
  static void printMethod(Class<Student> cls) {
    try { 
      Method m1 = cls.getMethod("getName");
      Method m2 = cls.getMethod("getScore", String.class);
      Method m3 = cls.getDeclaredMethod("getGrade", int.class);

      System.out.println("getName(): " + m1);
      System.out.println("getScore(String): " + m2);
      System.out.println("getDeclaredMethod(getGrade, int): " + m3);

      System.out.println("getName(): " + m1.getName());
      System.out.println("getReturnType(): " + m1.getReturnType());
      System.out.println("getParameterTypes(): " + m2.getParameterTypes());
      System.out.println("getModifiers(): " + m3.getModifiers());
    } catch (Exception e) {
      System.out.println("No such method: " + e.getMessage());
    }
  }
}

class Person {
  public String getName() {
      return "Person";
  }
}
class Student extends Person {
  public int getScore(String type) {
      return 99;
  }
  private int getGrade(int year) {
      return 1;
  }
}